/**
 * 
 */
package uno.utilities;

import uno.component.Card;
import uno.component.CardFactory;
import uno.component.CardValue;
import uno.component.HandOfCard;


/**
 * Gestisce i nomi univoci associati alle carte. Da tali nomi
 * e' possibile costruire una carta e viceversa dalla carta e'
 * possibile stabilire il suo nome.
 * 
 * @author mattia
 *
 */
public final class URNResolver {
	
	
	/**
	 * Prende un oggetto carta e ne restituisce l'URN sotto forma
	 * di oggetto stringa.
	 * 
	 * */
	public static String cardToURN(Card card){
		
		CardValue cv = card.getValue();
		
		String urn = "";
		if(cv.getType() == CardValue.NO_EFFECT){
			
			urn = cv.getType() + "" + cv.getNumber() + cv.getColor(); 
			
		} else if(cv.getType() == CardValue.PLUS_FOUR || cv.getType() == CardValue.CHANGE_COLOR){
			
			urn = "" + cv.getType();
			
		} else { 
			
			urn = cv.getType() + cv.getColor();
			
		}
		
		return urn;
	}
	
	
	
	/**
	 * Prende una stringa rappresentante l'urn
	 * e ne restituisce la carta corrispondente.
	 * 
	 * */
	public static Card URNToCard(String urn, HandOfCard parent) {		
		Card card = null;
		int number;
		String color;
		int type;
		
		// se è stata giocata una carta, quindi non è un PASS...
		if(urn != null) {
			// risolvo l'urn della carta giocata e creo la carta corrispondente
			type = Integer.parseInt("" + urn.charAt(0));
			switch(type) {

			case CardValue.NO_EFFECT:

				number = Integer.parseInt("" + urn.charAt(1));
				color = urn.substring(2, urn.length());
				card = CardFactory.createNormalCard(number, color, parent);
				break;

			case CardValue.CHANGE_COLOR:

				card = CardFactory.createSpecialCard(type, null, parent);
				break;

			case CardValue.CHANGE_FLOW:

				color = urn.substring(1, urn.length());
				card = CardFactory.createSpecialCard(type, color, parent);
				break;

			case CardValue.ONE_STOP:

				color = urn.substring(1, urn.length());
				card = CardFactory.createSpecialCard(type, color, parent);
				break;

			case CardValue.PLUS_FOUR:

				card = CardFactory.createSpecialCard(type, null, parent);
				break;

			case CardValue.PLUS_TWO:

				color = urn.substring(1, urn.length());
				card = CardFactory.createSpecialCard(type, color, parent);

			}
		}		
		return card;
	}

}
